<?php

# proveedor de mysql, aqui solo trabajaremos con mysql. pero podemos crear mas proveedores como Oracle y extenderlo de DatabaseProvider

class MySqlProvider extends DatabaseProvider {

    public function connect() {
        $this->resource = new mysqli(Config::$host, Config::$user, Config::$password, Config::$dataBase, Config::$port);
        return $this->resource;
    }

    public function getErrorNo() {
        return mysqli_errno($this->resource);
    }

    public function getError() {
        return mysqli_error($this->resource);
    }

    public function query($q) {
        return mysqli_query($this->resource, $q);
    }

    public function fetchArray($result) {
        return mysqli_fetch_array($result);
    }

    public function numFields() {
        return mysqli_field_count($this->resource);
    }

    public function isConnected() {
        return !is_null($this->resource);
    }

    public function escape($var) {
        return mysqli_real_escape_string($this->resource, $var);
    }

    public function close() {
        if ($this->isConnected() !== FALSE) {
            mysqli_close($this->resource);
        } elseif ($this->isConnected()) {
            mysqli_close($this->resource);
        }
    }

    public function fieldsDetail($result) {
        return mysqli_fetch_fields($result);
    }

    public function toJSON($result) {
        $arr = array();
        while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
            $arr[] = $row;
        }
        return $arr;
    }

}

class PostgreSQL extends DatabaseProvider {

    public function close() {
        
    }

    public function connect() {
        
    }

    public function escape($var) {
        
    }

    public function fetchArray($resource) {
        
    }

    public function fieldsDetail($result) {
        
    }

    public function getError() {
        
    }

    public function getErrorNo() {
        
    }

    public function isConnected() {
        
    }

    public function numFields() {
        
    }

    public function query($q) {
        
    }

    public function toJSON($result) {
        
    }

}

/**
 * CLASE ABSTRACTA GENÉRICA USADA CON INTERFAZ PARA CONETAR.
 */
abstract class DatabaseProvider {
    #Guarda internamente el objeto de conexión

    protected $resource;

    #Se conecta según los datos especificados

    public abstract function connect();
    #Obtiene el número del error

    public abstract function getErrorNo();
    #Obtiene el texto del error

    public abstract function getError();
    #Envía una consulta

    public abstract function query($q);
    #Convierte en array la fila actual y mueve el cursor

    public abstract function fetchArray($resource);
    #Comprueba si está conectado

    public abstract function isConnected();
    #Escapa los parámetros para prevenir inyección

    public abstract function escape($var);

    public abstract function close();

    public abstract function numFields();

    public abstract function fieldsDetail($result);

    public abstract function toJSON($result);
}
?>

